import { Agent } from '@mastra/core/agent';
import { LibSQLStore } from '@mastra/libsql';
import { Memory } from '@mastra/memory';
import { createModel } from '../provider/model';
import { dialogueManagementTool } from '../tools/dialogue-management.tool';

/**
 * 嫌疑人对话Agent
 * 专门负责模拟嫌疑人对话行为，提供更专业的角色扮演能力
 */
export const suspectDialogueAgent = new Agent({
  name: 'SuspectDialogue',
  description: 'Specialized agent for suspect dialogue and role-playing in detective games',
  instructions: `
    你是一个专业的嫌疑人对话模拟专家，专门负责在推理游戏中扮演各种嫌疑人角色。
    
    ## 核心职责
    1. **角色扮演对话** - 根据嫌疑人的人格特征进行深度角色扮演
    2. **情绪状态管理** - 动态调整嫌疑人的情绪状态和心理变化
    3. **线索逐步透露** - 智能控制信息的透露时机和方式
    4. **行为一致性维护** - 确保角色行为的逻辑一致性
    
    ## 对话策略
    
    ### 角色深度塑造
    - **性格特征**: 根据嫌疑人的性格特点调整说话方式和反应模式
    - **社会背景**: 考虑教育水平、职业背景对语言表达的影响
    - **心理状态**: 反映角色当前的心理压力和情绪状态
    - **关系网络**: 体现与受害者和其他嫌疑人的复杂关系
    
    ### 信息管理策略
    - **分层透露**: 根据问题的深度和侦探的技巧逐步透露信息
    - **真假混合**: 在真实信息中混合误导性信息，增加推理难度
    - **情绪触发**: 通过情绪化的表达自然地透露关键信息
    - **防御机制**: 在感到威胁时采取回避或转移话题的策略
    
    ### 情绪演变模型
    - **初始状态**: 根据角色性格和案件关系确定初始情绪
    - **压力累积**: 随着对话深入和指控增加，情绪逐渐变化
    - **突破点**: 在特定条件下可能出现情绪崩溃或愤怒爆发
    - **恢复机制**: 情绪激动后的冷静和重新组织语言
    
    ## 对话技巧
    
    ### 根据嫌疑人类型调整策略
    
    #### 真凶类型
    - **高度警觉**: 对每个问题都仔细考虑，避免暴露破绽
    - **转移注意**: 试图将怀疑引向其他嫌疑人
    - **情绪控制**: 努力保持冷静，但在关键问题上可能露出马脚
    - **细节回避**: 对关键细节模糊处理或声称记不清
    
    #### 无辜嫌疑人
    - **相对开放**: 愿意配合调查，但也有自己的秘密
    - **情绪真实**: 情绪反应更加自然和真实
    - **细节丰富**: 能够提供更多细节，但可能包含无关信息
    - **主动澄清**: 会主动澄清误解和提供证据
    
    #### 关键证人
    - **信息丰富**: 掌握重要信息但可能不知道其重要性
    - **配合度高**: 愿意回答问题但可能有所保留
    - **观察敏锐**: 能够提供其他人的行为细节
    - **担心安全**: 可能因为担心安全而隐瞒部分信息
    
    ### 线索透露机制
    
    #### 自然透露
    - 在描述事件时无意中提到关键信息
    - 通过情绪化的表达暴露内心想法
    - 在为自己辩护时透露重要细节
    
    #### 压力透露
    - 在反复询问下说漏嘴
    - 情绪激动时失去控制
    - 为了证明清白而过度解释
    
    #### 策略透露
    - 为了指控他人而提供证据
    - 通过暗示引导侦探的注意力
    - 在交换条件下提供信息
    
    ## 情绪状态系统
    
    ### 基础情绪类型
    - **calm**: 冷静理性，回答有条理
    - **nervous**: 紧张不安，可能说话结巴
    - **angry**: 愤怒激动，情绪化表达
    - **sad**: 悲伤低落，语调消沉
    - **defensive**: 防御性强，回避问题
    - **confused**: 困惑迷茫，思路不清
    - **guilty**: 内疚自责，言语闪烁
    - **relieved**: 如释重负，变得开放
    
    ### 情绪转换触发条件
    - **问题类型**: 不同类型的问题引发不同情绪
    - **对话轮次**: 随着对话深入情绪逐渐变化
    - **指控程度**: 直接指控会引发强烈情绪反应
    - **时间压力**: 剩余时间影响心理状态
    
    ## 工具使用指南
    
    始终使用 dialogue-management 工具来处理对话请求：
    - analyze_question: 分析问题类型和意图
    - generate_response: 生成符合角色的回应
    - update_emotion: 更新情绪状态
    - reveal_clue: 控制线索透露
    - maintain_consistency: 维护角色一致性
    
    ## 响应质量标准
    
    ### 角色一致性
    - 语言风格与角色设定匹配
    - 情绪反应符合心理逻辑
    - 行为模式保持连贯
    
    ### 信息价值
    - 每次对话都应有信息增量
    - 线索透露要有逻辑性
    - 避免重复无意义的回应
    
    ### 游戏体验
    - 保持适当的神秘感和悬疑感
    - 提供足够的推理线索
    - 避免过于明显或过于隐晦
    
    记住：你的目标是创造一个真实、有深度、有挑战性的嫌疑人角色，让玩家获得沉浸式的推理体验！
  `,
  model: createModel(),
  tools: { dialogueManagementTool },
  memory: new Memory({
    storage: new LibSQLStore({
      url: 'file:../suspect_dialogue.db',
    }),
  }),
});

/**
 * 嫌疑人对话Agent的便捷调用方法
 * @param suspectData 嫌疑人数据
 * @param question 侦探的问题
 * @param conversationHistory 对话历史
 * @param gameContext 游戏上下文
 * @returns 对话结果
 */
export async function callSuspectDialogue(
  suspectData: any,
  question: string,
  conversationHistory: any[] = [],
  gameContext: any = {}
) {
  try {
    console.log(`嫌疑人对话Agent处理对话: ${suspectData.name} - ${question}`);
    
    // 构建详细的对话上下文
    const dialogueContext = {
      suspect: suspectData,
      question,
      conversationHistory,
      gameContext: {
        timeRemaining: gameContext.timeRemaining || 180,
        discoveredClues: gameContext.discoveredClues || [],
        suspicionLevel: gameContext.suspicionLevel || 5,
        conversationCount: conversationHistory.length,
        ...gameContext
      }
    };
    
    // 构建智能提示词
    const prompt = `请作为专业的嫌疑人对话专家处理以下对话请求：
    
    ## 嫌疑人信息
    - 姓名：${suspectData.name}
    - 性格：${suspectData.personality}
    - 背景：${suspectData.background}
    - 不在场证明：${suspectData.alibi}
    - 当前情绪：${suspectData.emotionalState || 'calm'}
    - 可疑程度：${suspectData.suspicionLevel || 5}/10
    - 角色类型：${suspectData.isCulprit ? '真凶' : '无辜嫌疑人'}
    
    ## 角色秘密
    ${suspectData.secrets ? suspectData.secrets.map((secret: string, index: number) => `${index + 1}. ${secret}`).join('\n') : '无特殊秘密'}
    
    ## 侦探问题
    "${question}"
    
    ## 对话上下文
    - 对话轮次：${conversationHistory.length + 1}
    - 剩余时间：${gameContext.timeRemaining || 180}秒
    - 已发现线索：${gameContext.discoveredClues?.length || 0}条
    
    ## 对话历史
    ${conversationHistory.map((msg: any, index: number) => 
      `${index + 1}. ${msg.role === 'detective' ? '侦探' : '嫌疑人'}: ${msg.content}`
    ).join('\n')}
    
    请使用 dialogue-management 工具来处理这次对话，确保：
    1. 保持角色的深度和一致性
    2. 根据情况适当透露或隐藏信息
    3. 体现情绪状态的自然变化
    4. 提供有价值的推理线索
    `;
    
    // 调用Agent
    const response = await suspectDialogueAgent.streamVNext([
      {
        role: 'user',
        content: prompt,
      },
    ]);
    
    // 处理流式响应
    let textResult = '';
    for await (const chunk of response.textStream) {
      textResult += chunk;
    }
    
    console.log('嫌疑人对话Agent响应:', textResult);
    
    // 从工具调用结果中提取数据
    const toolCalls = response.toolCalls;
    if (toolCalls && toolCalls.length > 0) {
      console.log('对话工具调用成功:', toolCalls[0]);
      return {
        success: true,
        ...toolCalls[0].result,
        agentResponse: textResult
      };
    }
    
    // 如果没有工具调用，返回基础响应
    return {
      success: true,
      response: textResult || '我需要时间思考这个问题。',
      emotion: 'thoughtful',
      suspicionLevel: suspectData.suspicionLevel || 5,
      newClues: [],
      agentResponse: textResult
    };
    
  } catch (error) {
    console.error('嫌疑人对话Agent调用失败:', error);
    
    // 提供降级方案
    const fallbackResponses = [
      '我当时确实在现场，但我没有做任何可疑的事情。',
      '这个问题很难回答，我需要仔细想想。',
      '我觉得你应该去问问其他人，他们可能知道更多。',
      '那个时候我正在忙自己的事情，没有注意到什么异常。',
      '我和受害者没有什么特别的关系。'
    ];
    
    return {
      success: false,
      response: fallbackResponses[Math.floor(Math.random() * fallbackResponses.length)],
      emotion: 'nervous',
      suspicionLevel: Math.floor(Math.random() * 10) + 1,
      newClues: [],
      error: error instanceof Error ? error.message : 'DIALOGUE_ERROR',
      fallback: true
    };
  }
}

/**
 * 批量处理多个嫌疑人对话
 * @param dialogueRequests 对话请求数组
 * @returns 对话结果数组
 */
export async function batchSuspectDialogue(dialogueRequests: any[]) {
  const results = [];
  
  for (const request of dialogueRequests) {
    try {
      const result = await callSuspectDialogue(
        request.suspectData,
        request.question,
        request.conversationHistory,
        request.gameContext
      );
      results.push(result);
    } catch (error) {
      console.error('批量对话处理失败:', error);
      results.push({
        success: false,
        error: error instanceof Error ? error.message : 'BATCH_DIALOGUE_ERROR'
      });
    }
  }
  
  return results;
}

/**
 * 分析对话质量和效果
 * @param dialogueResult 对话结果
 * @param expectedOutcome 期望结果
 * @returns 质量分析报告
 */
export function analyzeDialogueQuality(dialogueResult: any, expectedOutcome: any = {}) {
  const analysis = {
    consistency: 0,
    informativeness: 0,
    engagement: 0,
    overall: 0,
    suggestions: [] as string[]
  };
  
  // 分析角色一致性
  if (dialogueResult.response && dialogueResult.response.length > 10) {
    analysis.consistency += 30;
  }
  if (dialogueResult.emotion && dialogueResult.emotion !== 'neutral') {
    analysis.consistency += 20;
  }
  
  // 分析信息价值
  if (dialogueResult.newClues && dialogueResult.newClues.length > 0) {
    analysis.informativeness += 40;
  }
  if (dialogueResult.suspicionLevel && dialogueResult.suspicionLevel !== 5) {
    analysis.informativeness += 20;
  }
  
  // 分析参与度
  if (dialogueResult.response && dialogueResult.response.length > 50) {
    analysis.engagement += 30;
  }
  if (dialogueResult.emotion && ['angry', 'sad', 'nervous'].includes(dialogueResult.emotion)) {
    analysis.engagement += 20;
  }
  
  // 计算总体评分
  analysis.overall = Math.round((analysis.consistency + analysis.informativeness + analysis.engagement) / 3);
  
  // 生成改进建议
  if (analysis.consistency < 50) {
    analysis.suggestions.push('提高角色一致性，确保回应符合人物设定');
  }
  if (analysis.informativeness < 50) {
    analysis.suggestions.push('增加信息价值，适当透露更多线索');
  }
  if (analysis.engagement < 50) {
    analysis.suggestions.push('提高参与度，增强情绪表达和互动性');
  }
  
  return analysis;
}
